Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 01106903cf2f130cfc2687961d7271bdb2a2b936


Parents : 75bd553
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-25T17:39:13-05:00

docs(README): update

Changes

6 files changed, 355 insertions(+), 213 deletions(-)

M README.md +4 -2

Diff

diff --git a/README.md b/README.md
index 1eaf9243..fb50f482 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,11 @@ This project is independent from the original Reticulum MeshChat project and is
- Website: [meshchatx.com](https://meshchatx.com)
- Source: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Official GitHub Mirror: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
-- Releases: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
+- Releases: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Changelog: [`CHANGELOG.md`](CHANGELOG.md)
-- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
+
+rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
+NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Important Changes from Reticulum MeshChat

diff --git a/lang/README.de.md b/lang/README.de.md
index a5cc954b..0a609b95 100644
--- a/lang/README.de.md
+++ b/lang/README.de.md
@@ -8,14 +8,16 @@ Dieses Projekt ist unabhaengig vom originalen Reticulum MeshChat und steht in ke
- Website: [meshchatx.com](https://meshchatx.com)
- Quellcode: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
-- Offizieller Spiegel: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) – derzeit auch fuer Windows- und macOS-Builds genutzt.
-- Releases: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
+- Offizielles GitHub-Mirror: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
+- Releases: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Aenderungsprotokoll: [`CHANGELOG.md`](../CHANGELOG.md)
-- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
+
+rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
+NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Wichtige Aenderungen gegenueber Reticulum MeshChat
-- Verwendet LXST
+- Verwendet LXST fuer Anrufe
- Peewee-ORM durch direktes SQL ersetzt
- Axios durch natives `fetch` ersetzt
- Electron 41.x (mit Node-24-Laufzeit)
@@ -27,7 +29,7 @@ Dieses Projekt ist unabhaengig vom originalen Reticulum MeshChat und steht in ke
> MeshChatX garantiert keine Datenkompatibilitaet mit aelteren Reticulum-MeshChat-Versionen. Erstellen Sie vor Migration oder Tests eine Datensicherung.
> [!WARNING]
-> Aeltere Systeme werden noch nicht vollstaendig unterstuetzt. Aktuelle Mindestanforderungen: Python `>=3.11` und Node `>=24` (Electron 41 entspricht Node 24; `engines` in `package.json` und CI folgen derselben Vorgabe).
+> Aeltere Systeme werden noch nicht unterstuetzt. Aktuelle Basis: Python `>=3.11` und Node `>=24` (Electron 41 entspricht Node 24; `engines` in `package.json` und CI folgen derselben Linie).
## Voraussetzungen
@@ -53,15 +55,15 @@ Waehlen Sie die Methode passend zu Umgebung und Paketierung.
| Python Wheel (`.whl`) | Ja | Jede Python-unterstuetzte Architektur | Headless/Webserver ohne Node-Build |
| Linux AppImage | Ja | `x64`, `arm64` | Portabler Desktop-Einsatz |
| Debian-Paket (`.deb`) | Ja | `x64`, `arm64` | Debian/Ubuntu-Installation |
-| RPM-Paket (`.rpm`) | Ja | CI-abhaengig | Fedora/RHEL/openSUSE |
+| RPM-Paket (`.rpm`) | Ja | Vom CI-Runner abhaengig (Veroeffentlichung) | Fedora/RHEL/openSUSE |
| Aus Quellcode | Lokal gebaut | Host-Architektur | Entwicklung und individuelle Builds |
Hinweise:
-- Der Release-Workflow baut explizit Linux `x64` und `arm64` AppImage + DEB.
-- RPM wird ebenfalls versucht und bei Erfolg hochgeladen.
+- GitHub Actions baut getaggte Releases: Windows und macOS in `.github/workflows/build-release.yml`, Linux Wheel/AppImage/deb/rpm in `.github/workflows/build-linux-release.yml` und das Container-Image in `.github/workflows/docker.yml`.
+- Linux `x64` und `arm64` AppImage + DEB werden auf GitHub gebaut; RPM wird versucht und hochgeladen, wenn es erzeugt wird.
-## Schnellstart: Docker
+## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ Hinweise:
docker compose up -d
```
-Entsprechend ohne Compose (gleiche Port-Bindung und Config-Volume):
-
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
-Alternativ kann das Image `quad4io/meshchatx:latest` (Docker Hub) verwendet werden.
+Sie koennen `quad4io/meshchatx:latest` statt des GHCR-Images verwenden, wenn Sie Docker Hub bevorzugen.
Standard-Compose-Datei:
@@ -160,7 +160,7 @@ Hinweise zu den Installationsbefehlen:
- `pnpm install --frozen-lockfile` verweigert Aenderungen an `pnpm-lock.yaml` und schlaegt fehl, wenn die Lockdatei nicht zu `package.json` passt. Damit wird verhindert, dass eine unerwartete Upstream-Version still eingespielt wird.
- `verify-store-integrity=true` ist auch in der projektweiten `.npmrc` gesetzt; die explizite `pnpm config set`-Zeile haertet zusaetzlich die Benutzerkonfiguration.
-- Lifecycle-Skripte (`preinstall`/`postinstall`) sind in pnpm v10+ standardmaessig blockiert. Nur die unter `pnpm.onlyBuiltDependencies` in `package.json` aufgefuehrten Pakete duerfen Installationsskripte ausfuehren (aktuell `electron`, `electron-winstaller`, `esbuild`, `protobufjs`).
+- Lifecycle-Skripte (`preinstall`/`postinstall`) sind in pnpm v10+ standardmaessig blockiert. Nur die unter `pnpm.onlyBuiltDependencies` in `package.json` aufgefuehrten Pakete duerfen Installationsskripte ausfuehren (aktuell `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` schlaegt frueh fehl, wenn `poetry.lock` nicht mit `pyproject.toml` synchron ist; `poetry install` aufloest danach nur aus der Lockdatei.
- Fuer eine strikte Lockfile-Installation (ohne implizite Lock-Aktualisierung) Poetry mit `pip install "poetry==2.3.4"` pinnen, passend zur CI-Version.
@@ -172,7 +172,7 @@ Um das native `meshchatx`-Programm (Alias: `meshchat`) mit zusaetzlicher Dateisy
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
-Dieselbe Seite erscheint in der in-app-**Dokumentation** (MeshChatX-Docs), wenn sie aus den gebuendelten oder synchronisierten `meshchatx-docs`-Dateien ausgeliefert wird.
+Dieselbe Seite erscheint in der in-app-Liste **Dokumentation** (MeshChatX-Dokumentation), wenn sie aus den gebuendelten oder synchronisierten `meshchatx-docs`-Dateien ausgeliefert wird.
## Linux-Desktop: Emoji-Schriften
@@ -214,6 +214,32 @@ Oder ueber Task:
task dist:fe:rpm
```
+## Container-Build (Wheel, AppImage, deb, rpm)
+
+`Dockerfile.build` fuehrt die gleichen Schritte wie die CI aus (Poetry, pnpm, `task`, APT-Paketabhaengigkeiten). Ausgelegt auf **linux/amd64** (NodeSource amd64, Task amd64). Standardziel ist alles; per Build-Arg ueberschreibbar.
+
+Werte fuer `MESHCHATX_BUILD_TARGETS`: `all` (Standard), `wheel` oder `electron` (AppImage + deb fuer x64 und arm64, RPM best-effort, kein wheel).
+
+Build:
+
+```bash
+docker build -f Dockerfile.build -t meshchatx-build:local .
+```
+
+Nur Wheel:
+
+```bash
+docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
+```
+
+`/artifacts` aus dem fertigen Image auf den Host kopieren:
+
+```bash
+cid=$(docker create meshchatx-build:local)
+docker cp "${cid}:/artifacts" ./meshchatx-artifacts
+docker rm "${cid}"
+```
+
## Architekturunterstuetzung
- Docker-Image: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (Build-Skripte vorhanden)
- macOS: Build-Skripte vorhanden (`arm64`, `universal`) fuer lokale Build-Umgebungen
-- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, plus universal
+- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), plus universal
## Android
@@ -235,23 +261,26 @@ Vom Repository-Root:
# 1) Chaquopy-Wheels gemaess android/app/build.gradle bauen
bash scripts/build-android-wheels-local.sh
-# 2) Universal-APKs bauen (ein Debug- und ein Release-APK; siehe android/README.md)
+# 2) Universal-APK bauen (ein Debug + ein Release pro Lauf; siehe android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-Es gibt nur eine Android-Variante (keine `slim`-/`full`-Flavors). Gradle synchronisiert den gesamten `meshchatx/`-Baum nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Packaging:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`).
+**Eine** Android-Variante. Gradle synchronisiert den gesamten `meshchatx/`-Ordner nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Verpackung:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`).
-Mit **`-PmeshchatxAbiPackaging=universal`** (Standard):
+Bei **`-PmeshchatxAbiPackaging=universal`** (Standard) liefert jeder Buildtyp ein APK mit allen gewaehlten ABIs:
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
+Bei **`-PmeshchatxAbiPackaging=split`** und mehr als einem ABI in `-PmeshchatxAbis` koennen pro-ABI-APKs entstehen, wie in [`android/README.md`](../android/README.md) beschrieben.
+
Hinweise:
-- Release-Ausgaben sind standardmaessig unsigniert (`scripts/sign-android-apks.sh`).
-- ABI: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`; Packaging: `-PmeshchatxAbiPackaging` oder `MESHCHATX_ABI_PACKAGING`.
-- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), wird dieses Rad beim Bundling bevorzugt. Details in [`android/README.md`](../android/README.md).
+- Release-Builds sind standardmaessig unsigniert, bis die Signatur konfiguriert ist (`scripts/sign-android-apks.sh`).
+- Android richtet sich nach den in `android/app/build.gradle` gelisteten ABIs (einschliesslich `armeabi-v7a`, falls aktiviert). Das Bauen von Radern fuer `armeabi-v7a` erfordert ein Android-SDK in `ANDROID_HOME` (siehe `android/README.md`).
+- ABI-Liste: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`. Verpackung: `-PmeshchatxAbiPackaging=universal|split` oder `MESHCHATX_ABI_PACKAGING`.
+- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), bevorzugt die Aktualisierung des Offline-Repositorys dieses Wheel gegueber PyPI. In der CI wird das Wheel vor dem Android-Gradle-Schritt gebaut.
Weitere Dokumentation:
@@ -270,7 +299,7 @@ Weitere Dokumentation:
| `--headless` | `MESHCHAT_HEADLESS` | `false` | Browser nicht automatisch oeffnen |
| `--auth` | `MESHCHAT_AUTH` | `false` | Basis-Authentifizierung aktivieren |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Datenverzeichnis |
-| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Frontend-Verzeichnis (fuer Installationen ohne gebundelte Assets) |
+| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Frontend-Verzeichnis (fuer Quell-Installationen ohne gebundelte Assets) |
## Branches
@@ -305,51 +334,50 @@ task build:all
Aktuelle Version in diesem Repository: `4.6.0`.
-- `package.json` ist die Quelle fuer die JavaScript/Electron-Version.
-- `meshchatx/src/version.py` wird aus `package.json` synchronisiert mit:
-
-```bash
-pnpm run version:sync
-```
-
-Fuer konsistente Releases die Versionsfelder dort abgleichen, wo noetig (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`).
+- Fuer Release-Bumps bearbeiten Sie **nur** `version` in **`package.json`**.
+- **`pnpm run version:sync`** (wird auch zu Beginn von **`pnpm run build`** ausgefuehrt) verbreitet diese Version in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (Produktzeile), **README** / **lang/README.*** (Zeilen mit aktueller Version), **`docs/meshchatx_on_raspberry_pi.md`** (pipx-Beispiel) und Hilfsfelder in **`packaging/arch/PKGBUILD`**.
+- **`meshchatx.__version__`** wird aus **`meshchatx/src/version.py`** gelesen, ohne `meshchatx.src` zu importieren, damit ein normales `import meshchatx` leicht bleibt.
+- **Changelog**-Eintrage bleiben beim Release manuell.
## Sicherheit
- [`SECURITY.md`](../SECURITY.md)
-- Integrierte Integritaetspruefungen und HTTPS/WSS-Standardeinstellungen in der App
-- CI- und Release-Workflows in `.github/workflows/`; auf Gitea nur `.gitea/workflows/github-release-sync.yml` für GitHub-Release-Sync (siehe `SECURITY.md`)
+- [`LEGAL.md`](../LEGAL.md)
+- Eingebaute Integritaetspruefungen und HTTPS/WSS-Standardwerte in der App-Laufzeit.
+- CI- und Release-Builds in GitHub Actions.
## Sprache hinzufuegen
-Die Locale-Erkennung erfolgt automatisch. Legen Sie eine neue Datei unter `meshchatx/src/frontend/locales/` an (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und einem obersten Feld `_languageName` fuer die Anzeige in der Sprachauswahl. Sie koennen `en.json` kopieren und alles von Hand uebersetzen; **maschinelle Erzeugung ist optional** und nie verpflichtend.
+Arbeitsablauf des Autors: ArgosTranslate, dann lokales LLM (Qwen 3 + Gemma 4).
+
+Korrekturen von der Community sind willkommen — per LXMF oder wo Sie erreichbar sind.
-**Korrekturen und menschliche Uebersetzungen sind willkommen.** Verbesserungen an bestehenden Locale-Dateien oder vollstaendig manuell uebersetzte Dateien koennen Sie per Pull Request oder Issue im [Quellcode-Repository](https://git.quad4.io/RNS-Things/MeshChatX) oder beim [GitHub-Spiegel](https://github.com/Quad4-Software/MeshChatX) einreichen.
+Die Locale-Erkennung erfolgt automatisch. Fuegen Sie Dateien unter `meshchatx/src/frontend/locales/` hinzu (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und oberstes `_languageName` fuer die Sprachauswahl. Sie koennen `en.json` kopieren und alles manuell uebersetzen; **maschinenunterstuetzte Erzeugung (optional)** ist niemals erforderlich.
-**Optional: Argos-Translate-Bootstrap** -- Wenn Sie einen maschinellen Erstentwurf aus `en.json` wollen, koennen Sie `scripts/argos_translate.py` nutzen. Es kuemmert sich um Formatierung und schuetzt Interpolationsvariablen (wie `{count}`) vor versehentlichen Aenderungen.
+**Optional: Argos-Translate-Start** — fuer einen Entwurf aus `en.json` koennen Sie `scripts/argos_translate.py` nutzen; es behandelt Formatierung, farbige Ausgabe und schuetzt z. B. `{count}`.
```bash
-# Installieren Sie argostranslate, falls noch nicht geschehen
-pip install argostranslate
+# argostranslate ggf. installieren
+pipx install argostranslate
-# Fuehren Sie das Uebersetzungsskript aus
+# Uebersetzungsskript ausfuehren
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Ihr Sprachname"
```
-Nach einem maschinellen Entwurf sollten ein LLM oder ein Mensch Grammatik, Kontext und Ton pruefen (z. B. formell vs. informell).
+Nach jeder maschinellen Runde Grammatik, Kontext und Ton (formell vs. informell) mit LLM oder Mensch pruefen.
-Schluesselparitaet pruefen: `pnpm test -- tests/frontend/i18n.test.js --run`
+`pnpm test -- tests/frontend/i18n.test.js --run` prueft die Schluesselparitaet mit `en.json`.
Keine weiteren Code-Aenderungen noetig. App, Sprachwahl und Tests lesen Locales zur Build-Zeit aus `meshchatx/src/frontend/locales/`.
## Mitwirkende
- [Liam Cottle](https://github.com/liamcottle) - Originales Reticulum MeshChat
-- [RFnexus](https://github.com/RFnexus) - Micron-Parser (JavaScript)
+- [RFnexus](https://github.com/RFnexus) - micron-Parser (JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Lizenz
Die projekt-eigenen Anteile stehen unter 0BSD.
-Urspruengliche Upstream-Anteile von MeshChat bleiben unter MIT.
+Urspruengliche Upstream-Anteile von Reticulum MeshChat bleiben unter MIT.
Vollstaendiger Text und Hinweise in [`../LICENSE`](../LICENSE).

diff --git a/lang/README.it.md b/lang/README.it.md
index 90683307..fffebaf6 100644
--- a/lang/README.it.md
+++ b/lang/README.it.md
@@ -8,14 +8,16 @@ Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e
- Sito web: [meshchatx.com](https://meshchatx.com)
- Codice sorgente: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
-- Mirror ufficiale: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — usato anche per le build Windows e macOS al momento.
-- Release: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
+- Mirror ufficiale su GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
+- Release: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Changelog: [`CHANGELOG.md`](../CHANGELOG.md)
-- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
+
+rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
+NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Modifiche importanti rispetto a Reticulum MeshChat
-- Usa LXST
+- Usa LXST per le chiamate
- Peewee ORM sostituito con SQL diretto
- Axios sostituito con `fetch` nativo
- Electron 41.x (runtime Node 24 incluso)
@@ -27,7 +29,7 @@ Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e
> MeshChatX non garantisce la compatibilita dei dati con le versioni precedenti di Reticulum MeshChat. Eseguire un backup prima della migrazione o dei test.
> [!WARNING]
-> I sistemi legacy non sono ancora completamente supportati. Requisiti minimi attuali: Python `>=3.11` e Node `>=24` (Electron 41 allinea a Node 24; `engines` in `package.json` e la CI seguono la stessa linea).
+> I sistemi legacy non sono ancora supportati. Base attuale: Python `>=3.11` e Node `>=24` (Electron 41 allineato a Node 24; `engines` in `package.json` e la CI seguono la stessa linea).
## Requisiti
@@ -53,15 +55,15 @@ Scegli il metodo in base all'ambiente e al formato del pacchetto.
| Python wheel (`.whl`) | Si | Qualsiasi architettura supportata da Python | Installazione headless/web-server senza build Node |
| Linux AppImage | Si | `x64`, `arm64` | Uso desktop portatile |
| Pacchetto Debian (`.deb`) | Si | `x64`, `arm64` | Installazione Debian/Ubuntu |
-| Pacchetto RPM (`.rpm`) | Si | Dipende dal CI | Fedora/RHEL/openSUSE |
+| Pacchetto RPM (`.rpm`) | Si | Dipende dal runner CI per l'artefatto pubblicato | Fedora/RHEL/openSUSE |
| Da sorgente | Compilato localmente | Architettura host | Sviluppo e build personalizzati |
Note:
-- Il workflow di release compila esplicitamente Linux `x64` e `arm64` AppImage + DEB.
-- RPM viene anche tentato e caricato quando prodotto con successo.
+- GitHub Actions compila le release con tag: Windows e macOS tramite `.github/workflows/build-release.yml`, Linux wheel/AppImage/deb/rpm tramite `.github/workflows/build-linux-release.yml`, e l'immagine container tramite `.github/workflows/docker.yml`.
+- Per Linux, `x64` e `arm64` AppImage + DEB sono compilate su GitHub; il RPM e tentato e viene caricato quando l'artefatto e prodotto.
-## Avvio rapido: Docker
+## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ Note:
docker compose up -d
```
-Equivalente senza Compose (stessa porta e volume di configurazione):
-
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
-Puoi usare l'immagine `quad4io/meshchatx:latest` (Docker Hub) al posto di GHCR.
+Al posto dell'immagine GHCR puoi usare `quad4io/meshchatx:latest` se preferisci Docker Hub.
Il file compose predefinito mappa:
@@ -160,7 +160,7 @@ Note sui comandi di installazione:
- `pnpm install --frozen-lockfile` rifiuta di aggiornare `pnpm-lock.yaml` e fallisce se il lockfile non corrisponde a `package.json`. Cosi' si evita che una versione upstream inattesa venga installata silenziosamente.
- `verify-store-integrity=true` e' impostato anche nel `.npmrc` del progetto; la riga esplicita `pnpm config set` rafforza inoltre la configurazione utente.
-- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`, `protobufjs`).
+- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` fallisce subito se `poetry.lock` non e' allineato con `pyproject.toml`; `poetry install` risolve poi solo dal lockfile.
- Per un'installazione Poetry strettamente basata sul lockfile (senza refresh implicito), fissa Poetry con `pip install "poetry==2.3.4"`, in linea con la CI.
@@ -172,7 +172,7 @@ Per eseguire il binario nativo `meshchatx` (alias: `meshchat`) con isolamento ag
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
-La stessa pagina compare nell'elenco **Documentazione** in-app (documentazione MeshChatX) quando viene servita dai file `meshchatx-docs` inclusi o sincronizzati.
+La stessa pagina compare nell'elenco **Documentazione** (documentazione MeshChatX) in-app quando viene servita dai file `meshchatx-docs` in bundle o sincronizzati.
## Desktop Linux: font emoji
@@ -214,6 +214,32 @@ Oppure tramite Task:
task dist:fe:rpm
```
+## Build container (wheel, AppImage, deb, rpm)
+
+`Dockerfile.build` esegue le stesse fasi usate in CI (Poetry, pnpm, `task`, dipendenze APT). Orientato a **linux/amd64** (tarball NodeSource amd64, Task amd64). Il target predefinito e completo; si puo sovrascrivere con un build-arg.
+
+Valori per `MESHCHATX_BUILD_TARGETS`: `all` (default), `wheel` o `electron` (AppImage + deb per x64 e arm64, RPM se possibile, senza wheel).
+
+Build:
+
+```bash
+docker build -f Dockerfile.build -t meshchatx-build:local .
+```
+
+Solo wheel:
+
+```bash
+docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
+```
+
+Copiare `/artifacts` dall'immagine finita all'host:
+
+```bash
+cid=$(docker create meshchatx-build:local)
+docker cp "${cid}:/artifacts" ./meshchatx-artifacts
+docker rm "${cid}"
+```
+
## Supporto architetture
- Immagine Docker: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (script di build disponibili)
- macOS: script di build disponibili (`arm64`, `universal`) per ambienti di build locali
-- Android: APK nativi — `arm64-v8a`, `x86_64`, universale
+- Android: APK nativi — `arm64-v8a`, `x86_64`, `armeabi-v7a` (ARM a 32 bit), piu universale
## Android
@@ -235,23 +261,26 @@ Dalla root del repository:
# 1) Build delle wheel Chaquopy usate da android/app/build.gradle
bash scripts/build-android-wheels-local.sh
-# 2) Build APK universali (un debug e una release; vedi android/README.md)
+# 2) Build APK universal (un debug + una release per esecuzione; vedi android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-Esiste una sola variante Android (niente flavor `slim` / `full`). Gradle sincronizza l'intero albero `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Imballaggio ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`).
+**Una** sola variante Android. Gradle sincronizza l'intera directory `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Packaging ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`).
-Con **`-PmeshchatxAbiPackaging=universal`** (predefinito):
+Con **`-PmeshchatxAbiPackaging=universal`** (predefinito) ogni tipo di build e un APK con tutti gli ABI scelti:
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
+Con **`-PmeshchatxAbiPackaging=split`** e piu di un ABI in `-PmeshchatxAbis`, Gradle puo emettere APK per ABI come documentato in [`android/README.md`](../android/README.md).
+
Note:
-- Le release sono non firmate di default (`scripts/sign-android-apks.sh`).
-- ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`; imballaggio: `-PmeshchatxAbiPackaging` o `MESHCHATX_ABI_PACKAGING`.
-- Se nella root del repo esiste `dist/reticulum_meshchatx-*.whl` (es. dopo `python -m build --wheel -o dist .`), quella wheel ha priorita nel bundle. Dettagli in [`android/README.md`](../android/README.md).
+- Gli output di release non sono firmati finche non configuri la firma (`scripts/sign-android-apks.sh`).
+- Android punta agli ABI elencati in `android/app/build.gradle` (incluso `armeabi-v7a` se abilitato). Le wheel per `armeabi-v7a` richiedono Android SDK su `ANDROID_HOME` (vedi `android/README.md`).
+- Selezione ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`. Packaging: `-PmeshchatxAbiPackaging=universal|split` o `MESHCHATX_ABI_PACKAGING`.
+- Se esiste in root `dist/reticulum_meshchatx-*.whl` (es. da `python -m build --wheel -o dist .`), l'aggiornamento del repository in bundle preferisce quella wheel rispetto a PyPI. In CI la wheel viene costruita prima del passo Gradle Android.
Documentazione aggiuntiva:
@@ -270,7 +299,7 @@ Documentazione aggiuntiva:
| `--headless` | `MESHCHAT_HEADLESS` | `false` | Non aprire il browser automaticamente |
| `--auth` | `MESHCHAT_AUTH` | `false` | Attiva autenticazione base |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Directory dei dati |
-| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundle | Directory dei file frontend (per installazioni senza asset inclusi) |
+| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Directory dei file frontend (necessaria per installazioni da sorgente senza asset in bundle) |
## Branch
@@ -301,55 +330,54 @@ Scorciatoie `Makefile`:
| `make test` | Test frontend e backend |
| `make clean` | Rimuove artefatti di build e node_modules |
-## Versioning
+## Versionamento
Versione attuale nel repository: `4.6.0`.
-- La fonte della versione JavaScript/Electron e `package.json`.
-- `meshchatx/src/version.py` e sincronizzato da `package.json` con:
-
-```bash
-pnpm run version:sync
-```
-
-Per release coerenti, allineare i campi di versione dove richiesto (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`).
+- L'unico valore che modifichi per un bump di release e **`version` in `package.json`**.
+- Esegui **`pnpm run version:sync`** (all'inizio anche di **`pnpm run build`**) per propagare in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (riga prodotto), **README** / **lang/README.\*** (righe "versione attuale"), **esempio pipx in `docs/meshchatx_on_raspberry_pi.md`**, e aiuti in **`packaging/arch/PKGBUILD`**.
+- **`meshchatx.__version__`** si legge da **`meshchatx/src/version.py`** senza importare **`meshchatx.src`**, cosi un semplice `import meshchatx` resta leggero.
+- Le voci del **changelog** restano manuali quando tagghi una release.
## Sicurezza
- [`SECURITY.md`](../SECURITY.md)
-- Controlli di integrita integrati e HTTPS/WSS predefiniti nell'app
-- CI e release in `.github/workflows/`; su Gitea solo `.gitea/workflows/github-release-sync.yml` per il sync delle release su GitHub (vedi `SECURITY.md`)
+- [`LEGAL.md`](../LEGAL.md)
+- Controlli di integrita integrati e valori predefiniti HTTPS/WSS nel runtime dell'app.
+- Build CI e release su GitHub Actions.
## Aggiungere una lingua
-Il rilevamento della lingua locale è automatico. Aggiungi un nuovo file in `meshchatx/src/frontend/locales/` (ad esempio `xx.json`) con le stesse chiavi di `en.json` e un campo in cima `_languageName` per l'etichetta nel selettore lingue. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione automatica è opzionale** e non è mai obbligatoria.
+Flusso dell'autore: ArgosTranslate, poi LLM locale (Qwen 3 + Gemma 4).
+
+Poi si accettano volentieri fix dalla community (LXMF o come mi contattate).
-**Correzioni e traduzioni umane sono benvenute.** Miglioramenti a un file esistente o un file interamente tradotto a mano possono essere inviati con una pull request o una segnalazione sul [repository sorgente](https://git.quad4.io/RNS-Things/MeshChatX) o sul [mirror GitHub](https://github.com/Quad4-Software/MeshChatX).
+Il rilevamento locale e automatico. Aggiungi un file in `meshchatx/src/frontend/locales/` (es. `xx.json`) con le stesse chiavi di `en.json` e un `_languageName` in cima per l'etichetta nel selettore. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione assistita da machine e opzionale** e non e mai obbligatoria.
-**Opzionale: bozza con Argos Translate** -- Se vuoi una prima bozza generata da `en.json`, puoi usare `scripts/argos_translate.py`. Gestisce la formattazione e aiuta a proteggere le variabili di interpolazione (come `{count}`).
+**Opzionale: avvio con Argos Translate** -- per una bozza partendo da `en.json` puoi usare `scripts/argos_translate.py` (formattazione, output a colori, variabili di interpolazione come `{count}`).
```bash
-# Installa argostranslate se non l'hai già fatto
-pip install argostranslate
+# Installa argostranslate se non l'hai gia
+pipx install argostranslate
# Esegui lo script di traduzione
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Nome della tua lingua"
```
-Dopo una passata automatica, fai verificare grammatica, contesto e tono a un LLM o a un revisore umano (es. formale vs informale).
+Dopo qualsiasi passaggio automatico, un LLM o un revisore umano controlli grammatica, contesto e tono (es. formale vs informale).
-Verifica la parità delle chiavi con: `pnpm test -- tests/frontend/i18n.test.js --run`
+Esegui `pnpm test -- tests/frontend/i18n.test.js --run` per verificare la parita delle chiavi con `en.json`.
Non sono necessarie altre modifiche al codice. L'app, il selettore della lingua e i test scoprono le lingue dalla cartella `meshchatx/src/frontend/locales/` durante la compilazione.
## Crediti
- [Liam Cottle](https://github.com/liamcottle) - Reticulum MeshChat originale
-- [RFnexus](https://github.com/RFnexus) - Parser Micron (JavaScript)
+- [RFnexus](https://github.com/RFnexus) - parser micron (JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Licenza
Le parti di proprieta del progetto sono rilasciate sotto 0BSD.
-Le parti originali upstream derivate da MeshChat restano sotto MIT.
+Le parti originali upstream da Reticulum MeshChat restano sotto MIT.
Per testo completo e note, vedi [`../LICENSE`](../LICENSE).

diff --git a/lang/README.ja.md b/lang/README.ja.md
index 9fe361e7..7e5c2ece 100644
--- a/lang/README.ja.md
+++ b/lang/README.ja.md
@@ -8,14 +8,16 @@ Liam Cottle 氏による Reticulum MeshChat を大幅に改修・機能拡張し
- ウェブサイト: [meshchatx.com](https://meshchatx.com)
- ソースコード: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
-- 公式ミラー: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — 現時点では Windows / macOS ビルドにも使用。
-- リリース: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
+- 公式 GitHub ミラー: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
+- リリース: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- 変更履歴: [`CHANGELOG.md`](../CHANGELOG.md)
-- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
+
+rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
+NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Reticulum MeshChat からの主な変更
-- LXST を使用
+- 通話に LXST を使用
- Peewee ORM を生 SQL に置き換え
- Axios をネイティブ `fetch` に置き換え
- Electron 41.x(同梱 Node 24 ランタイム)
@@ -27,7 +29,7 @@ Liam Cottle 氏による Reticulum MeshChat を大幅に改修・機能拡張し
> MeshChatX は旧バージョンの Reticulum MeshChat とのデータ互換性を保証しません。マイグレーションやテスト前にデータをバックアップしてください。
> [!WARNING]
-> レガシーシステムはまだ完全にはサポートされていません。現在の最低要件: Python `>=3.11`、Node `>=24`(Electron 41 は Node 24 系;`package.json` の `engines` と CI は同じ基準)。
+> レガシーシステムはまだサポートされません。現在の基準は Python `>=3.11` と Node `>=24`(Electron 41 は Node 24 に揃う;`package.json` の `engines` と CI も同じライン)。
## 必要条件
@@ -53,15 +55,15 @@ task build:all
| Python wheel (`.whl`) | はい | Python がサポートする全アーキテクチャ | Node ビルド不要のヘッドレス/Web サーバー |
| Linux AppImage | はい | `x64`, `arm64` | ポータブルデスクトップ |
| Debian パッケージ (`.deb`) | はい | `x64`, `arm64` | Debian/Ubuntu |
-| RPM パッケージ (`.rpm`) | はい | CI 依存 | Fedora/RHEL/openSUSE |
+| RPM パッケージ (`.rpm`) | はい | 公開用 CI ランナーに依存 | Fedora/RHEL/openSUSE |
| ソースから | ローカルビルド | ホストアーキテクチャ | 開発・カスタムビルド |
備考:
-- リリースワークフローは Linux `x64` および `arm64` の AppImage + DEB を明示的にビルドします。
-- RPM も試行され、成功時にアップロードされます。
+- GitHub Actions はタグ付きリリースをビルドします: Windows / macOS は `.github/workflows/build-release.yml`、Linux wheel / AppImage / deb / rpm は `.github/workflows/build-linux-release.yml`、コンテナイメージは `.github/workflows/docker.yml`。
+- Linux `x64` および `arm64` の AppImage + DEB は GitHub でビルド。RPM も試行し、成果物があればアップロードします。
-## クイックスタート: Docker
+## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ task build:all
docker compose up -d
```
-Compose を使わない場合の同等例(同じポート割り当てと設定ボリューム):
-
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
-イメージは Docker Hub の `quad4io/meshchatx:latest` に置き換え可能です。
+GHCR の代わりに Docker Hub の `quad4io/meshchatx:latest` を使えます。
デフォルトの compose ファイル:
@@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- `pnpm install --frozen-lockfile` は `pnpm-lock.yaml` の更新を拒否し、ロックファイルが `package.json` と一致しない場合は失敗します。これにより、想定外の上流バージョンが暗黙的にインストールされるのを防げます。
- `verify-store-integrity=true` はプロジェクトの `.npmrc` にも設定されています。上記の `pnpm config set` の行はユーザー設定側も明示的に固めるためのものです。
-- pnpm v10 以降、ライフサイクルスクリプト (`preinstall`/`postinstall`) はデフォルトでブロックされます。インストールスクリプトを実行できるのは `package.json` の `pnpm.onlyBuiltDependencies` に列挙されたパッケージ (現在は `electron`、`electron-winstaller`、`esbuild`、`protobufjs`) だけです。
+- pnpm v10 以降、ライフサイクルスクリプト (`preinstall`/`postinstall`) はデフォルトでブロックされます。インストールスクリプトを実行できるのは `package.json` の `pnpm.onlyBuiltDependencies` に列挙されたパッケージ(現在 `electron`、`electron-winstaller`、`esbuild`)だけです。
- `poetry check --lock` は `poetry.lock` と `pyproject.toml` が同期していない場合に即時失敗します。その後の `poetry install` はロックファイルからのみ解決します。
- 厳密にロックファイルだけで Poetry をインストールしたい場合は、CI と揃えるために `pip install "poetry==2.3.4"` で Poetry バージョンを固定してください。
@@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
-同梱または同期された `meshchatx-docs` から配信される場合、アプリ内の **ドキュメント**(MeshChatX ドキュメント)一覧にも同じページが表示されます。
+同梱または同期された `meshchatx-docs` から配信する場合、同じページがアプリ内 **ドキュメント** 一覧(MeshChatX ドキュメント)にも表示されます。
## Linux デスクトップ: 絵文字フォント
@@ -214,6 +214,32 @@ Task 経由:
task dist:fe:rpm
```
+## コンテナビルド(wheel、AppImage、deb、rpm)
+
+`Dockerfile.build` は CI と同じ手順(Poetry、pnpm、`task`、APT 依存)を実行します。**linux/amd64** 向け(NodeSource の amd64 tarball、Task の amd64 バイナリ)。デフォルトは全ターゲット。build-arg で上書き可能。
+
+`MESHCHATX_BUILD_TARGETS` の値: `all`(既定)、`wheel`、または `electron`(x64 / arm64 の AppImage + deb、RPM はベストエフォート、wheel なし)。
+
+ビルド:
+
+```bash
+docker build -f Dockerfile.build -t meshchatx-build:local .
+```
+
+wheel のみ:
+
+```bash
+docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
+```
+
+完成したイメージから `/artifacts` をホストにコピー:
+
+```bash
+cid=$(docker create meshchatx-build:local)
+docker cp "${cid}:/artifacts" ./meshchatx-artifacts
+docker rm "${cid}"
+```
+
## アーキテクチャサポート
- Docker イメージ: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64`(ビルドスクリプトあり)
- macOS: ローカルビルド向けにビルドスクリプトあり(`arm64`, `universal`)
-- Android: ネイティブ APK — ABI `arm64-v8a`、`x86_64`、および universal
+- Android: ネイティブ APK — ABI `arm64-v8a`、`x86_64`、`armeabi-v7a`(32-bit ARM)、および universal
## Android
@@ -235,23 +261,26 @@ MeshChatX はネイティブ Android APK のビルドに対応しています(
# 1) android/app/build.gradle で使う Chaquopy 用ホイールをビルド
bash scripts/build-android-wheels-local.sh
-# 2) 汎用 APK をビルド(debug と release 各 1 つ;android/README.md 参照)
+# 2) universal APK をビルド(1 回の実行で debug 1 本 + release 1 本;android/README.md 参照)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-Android は単一バリアント(`slim` / `full` フレーバーなし)。Gradle が `meshchatx/` 全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split`(`android/app/build.gradle`)。
+**単一**の Android バリアント。Gradle が `meshchatx/` ツリー全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split`(`android/app/build.gradle`)。
-**`-PmeshchatxAbiPackaging=universal`**(既定)のとき:
+**`-PmeshchatxAbiPackaging=universal`**(既定)では、各ビルド種別は選択した全 ABI を含む 1 つの APK です:
- デバッグ: `android/app/build/outputs/apk/debug/app-debug.apk`
- リリース: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
+**`-PmeshchatxAbiPackaging=split`** かつ `-PmeshchatxAbis` に ABI が複数ある場合、ABI 別 APK になることがあります([`android/README.md`](../android/README.md) 参照)。
+
備考:
-- リリースは既定で未署名(`scripts/sign-android-apks.sh`)。
-- ABI は `-PmeshchatxAbis` または `MESHCHATX_ABIS`、パッケージングは `-PmeshchatxAbiPackaging` または `MESHCHATX_ABI_PACKAGING`。
-- リポジトリルートに `dist/reticulum_meshchatx-*.whl` がある場合(例: `python -m build --wheel -o dist .` の後)、バンドルではそれが優先されます。詳細は [`android/README.md`](../android/README.md)。
+- リリース成果物は、署名を設定するまで既定で未署名(`scripts/sign-android-apks.sh`)。
+- 対象 ABI は `android/app/build.gradle` の一覧(`armeabi-v7a` 有効時を含む)。`armeabi-v7a` 用ホイールのビルドには `ANDROID_HOME` の Android SDK が必要(`android/README.md` 参照)。
+- ABI 上書き: `-PmeshchatxAbis` または `MESHCHATX_ABIS`。パッケージング: `-PmeshchatxAbiPackaging=universal|split` または `MESHCHATX_ABI_PACKAGING`。
+- リポジトリルートに `dist/reticulum_meshchatx-*.whl` があると(例: `python -m build --wheel -o dist .`)、同梱リポジトリの更新で PyPI よりその MeshChatX ホイールを優先。CI では Android Gradle の前にそのホイールをビルドします。
追加ドキュメント:
@@ -270,7 +299,7 @@ Android は単一バリアント(`slim` / `full` フレーバーなし)。Gr
| `--headless` | `MESHCHAT_HEADLESS` | `false` | ブラウザを自動で開かない |
| `--auth` | `MESHCHAT_AUTH` | `false` | 基本認証を有効化 |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | データディレクトリ |
-| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自動/同梱 | フロントエンドファイルディレクトリ(同梱資産のないインストール向け) |
+| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自動/同梱 | フロントエンドのディレクトリ(同梱資産なしのソースインストールで必要) |
## ブランチ
@@ -305,51 +334,50 @@ task build:all
このリポジトリの現在のバージョンは `4.6.0` です。
-- JavaScript / Electron のバージョンソースは `package.json`。
-- `meshchatx/src/version.py` は次で `package.json` と同期します:
-
-```bash
-pnpm run version:sync
-```
-
-リリースの一貫性のため、必要に応じて (`package.json`、`pyproject.toml`、`meshchatx/__init__.py`) のバージョンを揃えてください。
+- リリースのバージョン上げは **`package.json` の `version` のみ**編集します。
+- **`pnpm run version:sync`**(**`pnpm run build`** 開始時にも実行)で、**`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(製品行)、**README** / **lang/README.***(現在のバージョン行)、**`docs/meshchatx_on_raspberry_pi.md`** の pipx 例、**`packaging/arch/PKGBUILD`** の補助フィールドに反映します。
+- **`meshchatx.__version__`** は **`meshchatx/src/version.py`** から読み、**`meshchatx.src`** をインポートしないため、単なる `import meshchatx` は軽量のままです。
+- **Changelog** のエントリはリリース時に手作業のままです。
## セキュリティ
- [`SECURITY.md`](../SECURITY.md)
-- アプリ実行時の組み込み整合性チェックとデフォルトの HTTPS/WSS
-- CI とリリースは `.github/workflows/`。Gitea では GitHub リリース同期用に `.gitea/workflows/github-release-sync.yml` のみ(`SECURITY.md` を参照)
+- [`LEGAL.md`](../LEGAL.md)
+- アプリランタイムの組み込み整合性チェックと既定の HTTPS/WSS。
+- GitHub Actions での CI およびリリースビルド。
## 言語の追加
-ロケールの検出は自動で行われます。`meshchatx/src/frontend/locales/` に新しい JSON(例: `xx.json`)を追加し、`en.json` と同じキーに加え、言語選択に表示する名前を `_languageName` で指定します。`en.json` をコピーしてすべて手翻訳しても構いません。**機械翻訳による生成は任意**で、必須ではありません。
+作業手順: ArgosTranslate から ローカル LLM(Qwen 3 + Gemma 4)へ。
+
+そのあと、LXMF 等で修正を歓迎します。
-**修正や人間による翻訳の提供を歓迎します。** 既存ロケールの改善や完全な手翻訳ファイルは、[ソースリポジトリ](https://git.quad4.io/RNS-Things/MeshChatX)または [GitHub ミラー](https://github.com/Quad4-Software/MeshChatX) にプルリクエストまたは issue で送ってください。
+ロケールの検出は自動です。`meshchatx/src/frontend/locales/` に新しいファイル(例: `xx.json`)を追加し、`en.json` と同じキーに加え、セレクタ表示用の `_languageName` を最上位に置きます。`en.json` をコピーし手作業で訳すこともできます。**機械補助は任意**で、求められません。
-**任意: Argos Translate による下書き** -- `en.json` から機械翻訳のたたき台が欲しい場合は `scripts/argos_translate.py` を使えます。フォーマット処理や補間変数(`{count}` など)の保護に役立ちます。
+**任意: Argos Translate で土台** -- `en.json` から下書きするには `scripts/argos_translate.py`(整形・カラー出力、 `{count}` 等の保護)を使えます。
```bash
-# argostranslate をまだインストールしていない場合はインストールします
-pip install argostranslate
+# 必要なら argostranslate を導入
+pipx install argostranslate
-# 翻訳スクリプトを実行します
+# 翻訳スクリプトを実行
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "言語名"
```
-機械下書きのあとは、LLM または人間が文法・文脈・トーン(フォーマル/カジュアルなど)を確認するとよいでしょう。
+機械下書きのあと、文法・文脈・トーンは LLM か人が確認(フォーマル/カジュアル等)。
-`pnpm test -- tests/frontend/i18n.test.js --run` を実行して、`en.json` とのキーの一致を確認します。
+`pnpm test -- tests/frontend/i18n.test.js --run` で `en.json` とのキー一致を検証。
その他のコードの変更は必要ありません。アプリ、言語セレクター、およびテストは、ビルド時に `meshchatx/src/frontend/locales/` ディレクトリからロケールを検出します。
## クレジット
- [Liam Cottle](https://github.com/liamcottle) - オリジナル Reticulum MeshChat
-- [RFnexus](https://github.com/RFnexus) - Micron パーサー(JavaScript)
+- [RFnexus](https://github.com/RFnexus) - micron パーサー(JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## ライセンス
プロジェクト独自の部分は 0BSD です。
-MeshChat 由来の元の上流部分は MIT のままです。
+Reticulum MeshChat 由来の元の上流部分は MIT のままです。
全文と通知は [`../LICENSE`](../LICENSE) を参照してください。

diff --git a/lang/README.ru.md b/lang/README.ru.md
index 3a1adb3a..8bcef21a 100644
--- a/lang/README.ru.md
+++ b/lang/README.ru.md
@@ -8,14 +8,16 @@
- Сайт: [meshchatx.com](https://meshchatx.com)
- Исходный код: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
-- Официальное зеркало: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — пока также используется для сборок Windows и macOS.
-- Релизы: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
+- Официальное зеркало на GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
+- Релизы: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Журнал изменений: [`CHANGELOG.md`](../CHANGELOG.md)
-- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
+
+rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
+NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Важные отличия от Reticulum MeshChat
-- Используется LXST
+- Для вызовов используется LXST
- Peewee ORM заменён на прямой SQL
- Axios заменён на нативный `fetch`
- Electron 41.x (встроенная среда Node 24)
@@ -27,7 +29,7 @@
> MeshChatX не гарантирует совместимость данных со старыми версиями Reticulum MeshChat. Сделайте резервную копию перед миграцией или тестированием.
> [!WARNING]
-> Устаревшие системы пока не полностью поддерживаются. Текущие требования: Python `>=3.11` и Node `>=24` (Electron 41 соответствует Node 24; поле `engines` в `package.json` и CI на той же линии).
+> Устаревшие системы пока не поддерживаются. Текущий базис: Python `>=3.11` и Node `>=24` (Electron 41 выровнен с Node 24; поле `engines` в `package.json` и CI на той же линии).
## Требования
@@ -53,15 +55,15 @@ task build:all
| Python wheel (`.whl`) | Да | Любая архитектура, поддерживаемая Python | Безголовый/веб-сервер без сборки Node |
| Linux AppImage | Да | `x64`, `arm64` | Портативное использование на ПК |
| Debian-пакет (`.deb`) | Да | `x64`, `arm64` | Установка на Debian/Ubuntu |
-| RPM-пакет (`.rpm`) | Да | Зависит от CI | Fedora/RHEL/openSUSE |
+| RPM-пакет (`.rpm`) | Да | Зависит от раннера CI для публикуемого артефакта | Fedora/RHEL/openSUSE |
| Из исходников | Собирается локально | Архитектура хоста | Разработка и кастомные сборки |
Примечания:
-- Релизный workflow явно собирает Linux `x64` и `arm64` AppImage + DEB.
-- RPM также собирается при попытке и загружается при успехе.
+- GitHub Actions собирает помеченные тегом релизы: Windows и macOS в `.github/workflows/build-release.yml`, Linux wheel/AppImage/deb/rpm в `.github/workflows/build-linux-release.yml`, образ контейнера в `.github/workflows/docker.yml`.
+- AppImage + DEB для Linux `x64` и `arm64` собираются на GitHub; RPM собирается по возможности и выкладывается, если шаг дал артефакт.
-## Быстрый старт: Docker
+## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ task build:all
docker compose up -d
```
-То же самое без Compose (тот же порт и том конфигурации):
-
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
-Вместо образа можно указать `quad4io/meshchatx:latest` (Docker Hub).
+Вместо образа GHCR можно указать `quad4io/meshchatx:latest`, если предпочитаете Docker Hub.
Compose-файл по умолчанию:
@@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- `pnpm install --frozen-lockfile` запрещает обновление `pnpm-lock.yaml` и завершится с ошибкой, если lock-файл не соответствует `package.json`. Это исключает скрытую установку неожиданной upstream-версии.
- `verify-store-integrity=true` уже задан в `.npmrc` проекта; явный `pnpm config set` дополнительно ужесточает пользовательскую конфигурацию.
-- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v10+. Скрипты установки могут запускать только пакеты из `pnpm.onlyBuiltDependencies` в `package.json` (сейчас это `electron`, `electron-winstaller`, `esbuild`, `protobufjs`).
+- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v10+. Скрипты установки могут запускать только пакеты из `pnpm.onlyBuiltDependencies` в `package.json` (сейчас `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` сразу падает, если `poetry.lock` не синхронизирован с `pyproject.toml`; затем `poetry install` ставит зависимости только из lock-файла.
- Для строгой установки Poetry только из lock-файла зафиксируйте версию Poetry через `pip install "poetry==2.3.4"`, как это делает CI.
@@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
-Та же страница отображается во встроенной **Документации** (документация MeshChatX), когда она отдаётся из `meshchatx-docs`.
+Та же страница отображается в списке **Документация** (документация MeshChatX) в приложении, если файлы отдаются из встроенных или синхронизированных `meshchatx-docs`.
## Linux на ПК: шрифты эмодзи
@@ -214,6 +214,32 @@ pnpm run dist:rpm
task dist:fe:rpm
```
+## Сборка в контейнере (wheel, AppImage, deb, rpm)
+
+`Dockerfile.build` выполняет те же шаги, что и CI (Poetry, pnpm, `task`, пакетные зависимости APT). Ориентирован на **linux/amd64** (NodeSource amd64, Task amd64). Цель по умолчанию — всё; её можно переопределить build-arg.
+
+Для `MESHCHATX_BUILD_TARGETS` доступны: `all` (по умолчанию), `wheel` или `electron` (AppImage + deb для x64 и arm64, RPM по возможности, без wheel).
+
+Сборка:
+
+```bash
+docker build -f Dockerfile.build -t meshchatx-build:local .
+```
+
+Только wheel:
+
+```bash
+docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
+```
+
+Скопируйте `/artifacts` из готового образа на хост:
+
+```bash
+cid=$(docker create meshchatx-build:local)
+docker cp "${cid}:/artifacts" ./meshchatx-artifacts
+docker rm "${cid}"
+```
+
## Поддержка архитектур
- Образ Docker: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (скрипты сборки есть)
- macOS: скрипты сборки (`arm64`, `universal`) для локальных сред
-- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, плюс universal
+- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), плюс universal
## Android
@@ -235,23 +261,26 @@ MeshChatX поддерживает нативные Android APK (не тольк
# 1) Собрать колёса Chaquopy для android/app/build.gradle
bash scripts/build-android-wheels-local.sh
-# 2) Собрать универсальные APK (debug и release; см. android/README.md)
+# 2) Собрать universal APK (один debug + один release за прогон; см. android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-Одна вариант-сборка Android (без flavor `slim` / `full`). Gradle синхронизирует весь `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **ABI-упаковка:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`).
+**Один** вариант Android. Gradle синхронизирует весь каталог `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **Упаковка ABI:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`).
+
+С **`-PmeshchatxAbiPackaging=universal`** (по умолчанию) у каждого типа сборки один APK со всеми выбранными ABI:
-При **`-PmeshchatxAbiPackaging=universal`** (по умолчанию):
+- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
+- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
-- Отладка: `android/app/build/outputs/apk/debug/app-debug.apk`
-- Релиз: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
+С **`-PmeshchatxAbiPackaging=split`** и более чем одним ABI в `-PmeshchatxAbis` Gradle может выдавать отдельные APK по ABI, как в [`android/README.md`](../android/README.md).
Примечания:
-- Релизы по умолчанию не подписаны (`scripts/sign-android-apks.sh`).
-- ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`; упаковка: `-PmeshchatxAbiPackaging` или `MESHCHATX_ABI_PACKAGING`.
-- Если в корне репозитория есть `dist/reticulum_meshchatx-*.whl` (например после `python -m build --wheel -o dist .`), оно предпочитается при бандле. Подробнее в [`android/README.md`](../android/README.md).
+- Релизы по умолчанию не подписаны, пока не настроена подпись (`scripts/sign-android-apks.sh`).
+- Android ориентируется на ABI из `android/app/build.gradle` (в т.ч. `armeabi-v7a`, если включён). Сборка колёс для `armeabi-v7a` требует Android SDK в `ANDROID_HOME` (см. `android/README.md`).
+- Список ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`. Упаковка: `-PmeshchatxAbiPackaging=universal|split` или `MESHCHATX_ABI_PACKAGING`.
+- Если в корне репо есть `dist/reticulum_meshchatx-*.whl` (например из `python -m build --wheel -o dist .`), обновление встроенного репозитория предпочитает эту wheel пакету MeshChatX с PyPI. В CI wheel собирается до шага Android Gradle.
Дополнительная документация:
@@ -305,51 +334,50 @@ task build:all
Текущая версия в репозитории: `4.6.0`.
-- Источник версии JS/Electron — `package.json`.
-- `meshchatx/src/version.py` синхронизируется из `package.json`:
-
-```bash
-pnpm run version:sync
-```
-
-Для согласованных релизов выравнивайте поля версий где нужно (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`).
+- Редактируйте для релизного бампа **только** поле `version` в **`package.json`**.
+- Команда **`pnpm run version:sync`** (также в начале **`pnpm run build`**) распространяет эту версию в **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (строка продукта), **README** / **lang/README.\*** (строки «текущая версия»), **`docs/meshchatx_on_raspberry_pi.md`** (пример pipx) и вспомогательные поля **`packaging/arch/PKGBUILD`**.
+- **`meshchatx.__version__`** читается из **`meshchatx/src/version.py`** без импорта **`meshchatx.src`**, поэтому обычный `import meshchatx` остаётся лёгким.
+- Записи **changelog** по-прежнему вносятся вручную при релизе.
## Безопасность
- [`SECURITY.md`](../SECURITY.md)
-- Встроенные проверки целостности и HTTPS/WSS по умолчанию в приложении
-- CI и релизы в `.github/workflows/`; на Gitea только `.gitea/workflows/github-release-sync.yml` для выгрузки релизов на GitHub (см. `SECURITY.md`)
+- [`LEGAL.md`](../LEGAL.md)
+- Встроенные проверки целостности и значения по умолчанию HTTPS/WSS в рантайме приложения.
+- Сборка CI и релизы на GitHub Actions.
## Добавление языка
-Обнаружение локали происходит автоматически. Добавьте новый файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что и в `en.json`, и полем `_languageName` в начале для подписи в селекторе языка. Можно скопировать `en.json` и перевести всё вручную; **автоматическая генерация (Argos и т. п.) необязательна** и не требуется.
+Авторский рабочий процесс: ArgosTranslate, затем локальная LLM (Qwen 3 + Gemma 4).
+
+Затем правки и улучшения от сообщества приветствуются — через LXMF или любой доступный канал.
-**Исправления и переводы от людей приветствуются.** Улучшения существующих файлов локали или полностью ручной перевод можно прислать через pull request или issue в [исходном репозитории](https://git.quad4.io/RNS-Things/MeshChatX) или на [зеркале GitHub](https://github.com/Quad4-Software/MeshChatX).
+Обнаружение локали автоматическое. Добавьте файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что в `en.json`, и строку верхнего уровня `_languageName` для подписи в селекторе. Можно скопировать `en.json` и перевести вручную; **машинная генерация (в т. ч. Argos) необязательна** и никогда не требуется.
-**По желанию: черновик через Argos Translate** -- если нужен машинный первый проход из `en.json`, можно использовать `scripts/argos_translate.py`. Он обрабатывает форматирование и помогает защитить переменные интерполяции (например `{count}`).
+**По желанию: старт с Argos Translate** — для чернового перевода из `en.json` можно вызвать `scripts/argos_translate.py` (форматирование, цветной вывод, защита плейсхолдеров вроде `{count}`).
```bash
-# Установите argostranslate, если вы еще этого не сделали
-pip install argostranslate
+# Установите argostranslate при необходимости
+pipx install argostranslate
# Запустите скрипт перевода
-python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название вашего языка"
+python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название языка"
```
-После машинного черновика имеет смысл проверить грамматику, контекст и тон с помощью LLM или человека (формальный или неформальный стиль).
+После любой машинной прогонки пусть LLM или человек проверяет грамматику, контекст и тон (например формальный/неформальный стиль).
-Проверьте совпадение ключей с помощью: `pnpm test -- tests/frontend/i18n.test.js --run`
+`pnpm test -- tests/frontend/i18n.test.js --run` — проверка равенства ключей с `en.json`.
Никаких других изменений в коде не требуется. Приложение, селектор языка и тесты обнаруживают локали из каталога `meshchatx/src/frontend/locales/` во время сборки.
## Авторы
- [Liam Cottle](https://github.com/liamcottle) — оригинальный Reticulum MeshChat
-- [RFnexus](https://github.com/RFnexus) — парсер Micron (JavaScript)
+- [RFnexus](https://github.com/RFnexus) — парсер micron (JavaScript)
- [markqvist](https://github.com/markqvist) — Reticulum, LXMF, LXST
## Лицензия
Собственные части проекта лицензированы по 0BSD.
-Оригинальные upstream-части, унаследованные от MeshChat, остаются под MIT.
+Оригинальные upstream-части из Reticulum MeshChat остаются под MIT.
Полный текст и уведомления см. в [`../LICENSE`](../LICENSE).

diff --git a/lang/README.zh.md b/lang/README.zh.md
index 83c14226..b3a926e5 100644
--- a/lang/README.zh.md
+++ b/lang/README.zh.md
@@ -8,14 +8,16 @@ Liam Cottle 开发的 Reticulum MeshChat 的一个功能丰富的深度修改分
- 网站: [meshchatx.com](https://meshchatx.com)
- 源码: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
-- 官方镜像: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — 目前亦用于 Windows 与 macOS 构建。
-- 发行版: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
+- 官方 GitHub 镜像: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
+- 发行版: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- 变更日志: [`CHANGELOG.md`](../CHANGELOG.md)
-- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
+
+rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
+NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## 与 Reticulum MeshChat 的重要差异
-- 使用 LXST
+- 通话使用 LXST
- 以原生 SQL 替代 Peewee ORM
- 以原生 `fetch` 替代 Axios
- 使用 Electron 41.x(内置 Node 24 运行时)
@@ -27,7 +29,7 @@ Liam Cottle 开发的 Reticulum MeshChat 的一个功能丰富的深度修改分
> MeshChatX 不保证与旧版 Reticulum MeshChat 的数据兼容。迁移或测试前请备份数据。
> [!WARNING]
-> 旧系统尚未完全支持。当前最低要求:Python `>=3.11`,Node `>=24`(Electron 41 与 Node 24 一致;`package.json` 的 `engines` 与 CI 同一基线)。
+> 旧系统尚不支持。当前基线为 Python `>=3.11` 与 Node `>=24`(Electron 41 与 Node 24 一致;`package.json` 的 `engines` 与 CI 同一基线)。
## 系统要求
@@ -53,15 +55,15 @@ task build:all
| Python wheel (`.whl`) | 是 | 任何 Python 支持的架构 | 无需 Node 构建的无头/Web 服务器安装 |
| Linux AppImage | 是 | `x64`, `arm64` | 便携式桌面使用 |
| Debian 包 (`.deb`) | 是 | `x64`, `arm64` | Debian/Ubuntu 安装 |
-| RPM 包 (`.rpm`) | 是 | 取决于 CI | Fedora/RHEL/openSUSE |
+| RPM 包 (`.rpm`) | 是 | 取决于发布所用 CI 运行环境 | Fedora/RHEL/openSUSE |
| 从源码 | 本地构建 | 主机架构 | 开发与自定义构建 |
说明:
-- 发布工作流明确构建 Linux `x64` 与 `arm64` 的 AppImage + DEB。
-- RPM 亦会尝试构建,成功时上传。
+- GitHub Actions 构建带标签的发行版:Windows 与 macOS 见 `.github/workflows/build-release.yml`,Linux wheel/AppImage/deb/rpm 见 `.github/workflows/build-linux-release.yml`,容器镜像见 `.github/workflows/docker.yml`。
+- Linux `x64` 与 `arm64` 的 AppImage + DEB 在 GitHub 上构建;RPM 会尝试构建,产出则上传。
-## 快速开始: Docker
+## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ task build:all
docker compose up -d
```
-不使用 Compose 时的等效命令(相同的端口绑定与配置卷):
-
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
-镜像也可换为 Docker Hub 的 `quad4io/meshchatx:latest`。
+若倾向 Docker Hub,可将镜像换为 `quad4io/meshchatx:latest`。
默认 compose 文件映射:
@@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- `pnpm install --frozen-lockfile` 禁止更新 `pnpm-lock.yaml`,若 lockfile 与 `package.json` 不一致则直接失败。这能阻止意外的上游版本被静默安装。
- `verify-store-integrity=true` 已在项目的 `.npmrc` 中设置;显式的 `pnpm config set` 行同时加固用户级配置。
-- pnpm v10+ 默认禁用所有生命周期脚本(`preinstall`/`postinstall`)。仅 `package.json` 中 `pnpm.onlyBuiltDependencies` 列出的包允许执行安装脚本(当前为 `electron`、`electron-winstaller`、`esbuild`、`protobufjs`)。
+- pnpm v10+ 默认禁用所有生命周期脚本(`preinstall`/`postinstall`)。仅 `package.json` 中 `pnpm.onlyBuiltDependencies` 列出的包允许执行安装脚本(当前为 `electron`、`electron-winstaller`、`esbuild`)。
- `poetry check --lock` 会在 `poetry.lock` 与 `pyproject.toml` 不同步时立即失败;随后的 `poetry install` 只会从 lock 文件解析依赖。
- 若需严格按 lock 文件安装 Poetry 依赖(不进行隐式刷新),用 `pip install "poetry==2.3.4"` 固定 Poetry 版本,与 CI 保持一致。
@@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
-在提供已捆绑或已同步的 `meshchatx-docs` 时,应用内 **文档**(MeshChatX 文档)列表亦会显示同一页面。
+从已捆绑或已同步的 `meshchatx-docs` 文件提供服务时,应用内 **文档** 列表(MeshChatX 文档)亦会显示同一页面。
## Linux 桌面:绘文字字体
@@ -214,6 +214,32 @@ pnpm run dist:rpm
task dist:fe:rpm
```
+## 容器构建(wheel、AppImage、deb、rpm)
+
+`Dockerfile.build` 执行与 CI 相同的步骤(Poetry、pnpm、`task`、APT 等)。面向 **linux/amd64**(NodeSource amd64 压缩包、Task amd64 二进制)。默认目标为全部;可用 build 参数覆盖。
+
+`MESHCHATX_BUILD_TARGETS` 可选:`all`(默认)、`wheel` 或 `electron`(x64 与 arm64 的 AppImage + deb、尽力构建 RPM、不含 wheel)。
+
+构建:
+
+```bash
+docker build -f Dockerfile.build -t meshchatx-build:local .
+```
+
+仅 wheel:
+
+```bash
+docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
+```
+
+将完成镜像中的 `/artifacts` 拷到本机:
+
+```bash
+cid=$(docker create meshchatx-build:local)
+docker cp "${cid}:/artifacts" ./meshchatx-artifacts
+docker rm "${cid}"
+```
+
## 架构支持
- Docker 镜像: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64`(提供构建脚本)
- macOS: 提供构建脚本(`arm64`、`universal`),适用于本地构建环境
-- Android: 原生 APK — ABI `arm64-v8a`、`x86_64` 与 universal
+- Android: 原生 APK — ABI `arm64-v8a`、`x86_64`、`armeabi-v7a`(32 位 ARM),以及 universal
## Android
@@ -235,23 +261,26 @@ MeshChatX 支持构建原生 Android APK(不仅限于 Termux)。
# 1) 构建 android/app/build.gradle 所需的 Chaquopy 轮子
bash scripts/build-android-wheels-local.sh
-# 2) 构建通用 APK(一次 debug + 一次 release;见 android/README.md)
+# 2) 构建 universal APK(每次运行各一 debug + 一 release;见 android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-仅一种 Android 变体(无 `slim` / `full` flavor)。Gradle 将完整 `meshchatx/` 同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。
+**单一** Android 变体。Gradle 将完整 `meshchatx/` 树同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel 包。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。
-**`-PmeshchatxAbiPackaging=universal`**(默认)时:
+**`-PmeshchatxAbiPackaging=universal`**(默认)下,每种构建类型各一个包含所有已选 ABI 的 APK:
- 调试:`android/app/build/outputs/apk/debug/app-debug.apk`
- 发布:`android/app/build/outputs/apk/release/app-release-unsigned.apk`
+**`-PmeshchatxAbiPackaging=split`** 且 `-PmeshchatxAbis` 含多个 ABI 时,Gradle 可能按 ABI 分别产出 APK,见 [`android/README.md`](../android/README.md)。
+
说明:
-- 发布构建默认未签名(`scripts/sign-android-apks.sh`)。
-- ABI:`-PmeshchatxAbis` 或 `MESHCHATX_ABIS`;打包:`-PmeshchatxAbiPackaging` 或 `MESHCHATX_ABI_PACKAGING`。
-- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .` 后),捆绑时优先使用该 wheel。详见 [`android/README.md`](../android/README.md)。
+- 发布产物默认未签名,除非配置签名(`scripts/sign-android-apks.sh`)。
+- Android 目标 ABI 以 `android/app/build.gradle` 为准(含启用时的 `armeabi-v7a`)。为 `armeabi-v7a` 构建 wheel 需本机 `ANDROID_HOME` 上有 Android SDK(见 `android/README.md`)。
+- 覆盖 ABI:`-PmeshchatxAbis` 或 `MESHCHATX_ABIS`。打包:`-PmeshchatxAbiPackaging=universal|split` 或 `MESHCHATX_ABI_PACKAGING`。
+- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .`),刷新内置仓库时优先于 PyPI 使用该 MeshChatX wheel。CI 在 Android Gradle 步骤前会构建该 wheel。
更多文档:
@@ -270,7 +299,7 @@ cd android
| `--headless` | `MESHCHAT_HEADLESS` | `false` | 不自动打开浏览器 |
| `--auth` | `MESHCHAT_AUTH` | `false` | 启用基本认证 |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | 数据目录 |
-| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自动/捆绑 | 前端文件目录(无捆绑资源安装时需要) |
+| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自动/捆绑 | 前端文件目录(源码安装且未捆绑资源时需要) |
## 分支
@@ -301,55 +330,54 @@ task build:all
| `make test` | 运行前端与后端测试 |
| `make clean` | 移除构建产物与 node_modules |
-## 版本
+## 版本管理
本仓库当前版本: `4.6.0`。
-- JavaScript/Electron 版本以 `package.json` 为准。
-- `meshchatx/src/version.py` 通过以下命令与 `package.json` 同步:
-
-```bash
-pnpm run version:sync
-```
-
-发布时请保持相关字段一致(`package.json`、`pyproject.toml`、`meshchatx/__init__.py`)。
+- 发布版本号**只**改 **`package.json` 的 `version`**。
+- 运行 **`pnpm run version:sync`**(在 **`pnpm run build`** 开头也会执行)可将该版本同步到 **`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(产品行)、**README** / **lang/README.\*** 中的“当前版本”行、**`docs/meshchatx_on_raspberry_pi.md`** 的 pipx 示例,以及 **`packaging/arch/PKGBUILD`** 的辅助字段。
+- **`meshchatx.__version__`** 从 **`meshchatx/src/version.py`** 读取且不导入 **`meshchatx.src`**,因此普通 `import meshchatx` 仍很轻量。
+- **变更日志**在发版时仍由人工维护。
## 安全
- [`SECURITY.md`](../SECURITY.md)
-- 应用内置完整性检查与默认 HTTPS/WSS
-- CI 与发版在 `.github/workflows/`;Gitea 仅保留 `.gitea/workflows/github-release-sync.yml` 用于同步 GitHub Release(见 `SECURITY.md`)
+- [`LEGAL.md`](../LEGAL.md)
+- 应用运行时内置完整性检查与默认 HTTPS/WSS。
+- CI 与发行构建在 GitHub Actions。
## 添加语言
-语言检测是自动的。在 `meshchatx/src/frontend/locales/` 下新增 JSON 文件(例如 `xx.json`),键与 `en.json` 一致,并在顶层设置 `_languageName` 作为语言选择器中的显示名称。可以复制 `en.json` 后完全人工翻译;**使用 Argos 等机器辅助生成是可选的**,并非必需。
+作者流程:ArgosTranslate,再到本地 LLM(Qwen 3 + Gemma 4)。
+
+之后欢迎通过 LXMF 或其他方式提交修正。
-**欢迎提交纠错与人工翻译。** 若修正现有语言文件或提交完整人工翻译,请通过合并请求或议题提交至[项目源码仓库](https://git.quad4.io/RNS-Things/MeshChatX)或 [GitHub 镜像](https://github.com/Quad4-Software/MeshChatX)。
+语言环境为自动发现。在 `meshchatx/src/frontend/locales/` 添加新文件(如 `xx.json`),键与 `en.json` 相同,并设顶层 `_languageName` 作为选择器标签。可复制 `en.json` 全手工翻译;**机器辅助生成(可选)**从不要求。
-**可选:Argos Translate 初稿** -- 若需要从 `en.json` 生成机器翻译初稿,可使用 `scripts/argos_translate.py`。它会处理格式并有助于保护插值变量(如 `{count}`)。
+**可选:Argos Translate 起步** -- 若需从 `en.json` 生成初稿,可使用 `scripts/argos_translate.py`(处理格式、彩色输出,并保护如 `{count}` 的插值变量)。
```bash
-# 如果尚未安装,请安装 argostranslate
-pip install argostranslate
+# 若尚未安装 argostranslate
+pipx install argostranslate
# 运行翻译脚本
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "您的语言名称"
```
-机器初稿之后,建议由 LLM 或人工审校语法、语境与语气(如正式与非正式)。
+任何机器辅助之后,请用 LLM 或人工核对语法、语境与语气(如正式/非正式)。
-运行 `pnpm test -- tests/frontend/i18n.test.js --run` 验证与 `en.json` 的键一致性。
+运行 `pnpm test -- tests/frontend/i18n.test.js --run` 校验与 `en.json` 的键一致。
不需要其他代码更改。应用程序、语言选择器和测试在构建时从 `meshchatx/src/frontend/locales/` 目录发现所有语言环境。
## 致谢
- [Liam Cottle](https://github.com/liamcottle) - 原始 Reticulum MeshChat
-- [RFnexus](https://github.com/RFnexus) - Micron 解析器(JavaScript)
+- [RFnexus](https://github.com/RFnexus) - micron 解析器(JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## 许可证
项目自有部分采用 0BSD 许可。
-源自 MeshChat 的原始上游部分继续采用 MIT 许可。
+源自 Reticulum MeshChat 的原始上游部分继续采用 MIT 许可。
完整文本与声明请见 [`../LICENSE`](../LICENSE)。


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────